<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>

<style>
    div {
        margin: 100px auto;
    }

    .father {
        display: flex;
        justify-content: center;
        align-items: center;
        width: 200px;
        height: 200px;
        background-color: pink;
    }

    .son {
        width: 100px;
        height: 100px;
        background-color: skyblue;
    }
</style>
<body>

<div class="father">
    <div class="son">son盒子</div>
</div>


<script>
    /**
     * 事件发生时会在元素节点之间按照特定的顺序传播, 这个传播过程即DOM事件流
     *
     * dom 事件流 三个阶段
     * 1.JS代码中只能执行捕获或则冒泡其中的一个阶段
     * 2.onclick 和 attachEvent (ie) 只能得到冒泡阶段
     * 3.捕获阶段如果 addEventListener 第三个参数是 true 那么则处于捕获阶段
     * document -> html -> body -> father -> son
     * <p>
     * 注意:
     *
     */
        // 4.冒泡阶段 如果 addEventListener 第三个参数是 false 或 省略, 那么处理冒泡阶段
        //  son -> father -> body -> html -> document
    var son = document.querySelector('.son');
    var father = document.querySelector('.father');
    son.addEventListener('click', function (e) {
        alert('bubble ---- son');
        // propagation -> 传播
        e.stopPropagation();        // 标准写法
        // e.cancelBubble = true;      // 非标准写法 ie678
    }, false);

    father.addEventListener('click', function (e) {
        alert('bubble ---- father');
        e.stopPropagation();
    })

    document.addEventListener('click', function () {
        alert('bubble ---- document')
    })
</script>
</body>
</html>
